home *** CD-ROM | disk | FTP | other *** search
/ Scene Storm / Scene Storm - Volume 1.iso / coding / c / amiexpress / source / doors / aeconf / aeconf.c next >
Encoding:
C/C++ Source or Header  |  1992-12-26  |  43.4 KB  |  2,001 lines

  1. #include <exec/types.h>
  2. #include <exec/exec.h>
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include "dh1:source/doors/romconf/doorheader.h"
  6. #define BPTR long
  7. #define sm sendmessage
  8. #define pm prompt
  9. #define gu getuserstring
  10. #define pu putuserstring
  11. #define TIMEOUT 1
  12. #define hk hotkey
  13. static char MsgBuf[100][80];
  14. #define ACCESS_WRITE -1
  15. #define ACCESS_READ -2
  16. #define LOCK 1
  17. #define NOLOCK 0
  18. #define li lineinput
  19. int ErrorLevel=0;
  20. int Lines=0;
  21. int ActiveConf=0;
  22. void end(void);
  23. int strnicmp(char *str1,char *str2,int len);
  24. int Edit(void);
  25. void Editor(void);
  26. void SaveMsg();
  27. void GiveNet();
  28. int MsgToHeader(int opt);
  29. void MsgReceiveHeader();
  30. BPTR LockUserBase(void);
  31. void MsgNetHeader(int opt);
  32. void Upload_A_File(int);
  33. void free_pdir();
  34. void InitBuffer();
  35. void ReplyMyMsg();
  36. void PackNet();
  37. int Allowed(void);
  38. void CleanPlayPen();
  39. void Pause();
  40. void UnPackNet();
  41. int MsgSubjectHeader(int opt);
  42. void SaveUser(void);
  43. struct FileLock      *pdir = NULL;
  44.    struct FileInfoBlock *dir_info = NULL;
  45. int MsgHeaders(int opt);
  46. void ReadMsg();
  47.  
  48. void BufferMsg(long msg);
  49. int ALine=0;
  50. int ACPError=0;
  51. int ProcessLine(char *pat, char *vorig, char *dest);
  52. int YesNo(UWORD flag);
  53. int stats=0;
  54. char NetAddress[200];
  55. void CreateFile(char *str);
  56. struct User
  57. {
  58.   char Name[31];
  59.   char Handle[31];
  60.   USHORT Slot_Number;
  61.   ULONG AutoMsg;
  62.   ULONG LastMsg;
  63.   ULONG MsgsPosted;
  64.   ULONG Mail_Received;
  65. } U;
  66. ULONG ConfMsg;
  67.  
  68. struct MyStats
  69. {
  70.   ULONG NMsg;
  71. } Stats;
  72.  
  73. struct MyHeader
  74. {
  75.   char Subject[31];
  76.   char FName[31];
  77.   char TName[31];
  78.   char TNName[31];
  79.   char FNName[31];
  80.   ULONG MsgNum;
  81.   ULONG Received;
  82.   ULONG Written;
  83.   char Type;
  84.   BOOL Net;
  85.   BOOL Deleted;
  86. } Head;
  87. char ConfName[80],ConfLoc[80];
  88. int Conf;
  89. void strlim(char *str1,char *str2,int limit);
  90. void sr(char *str);
  91. long LookUp(char *str);
  92. void AddUser(void);
  93. void InitUser();
  94. void Validate(char *str);
  95. int GetConf(char *str,int num);
  96. void GetHighMsg(int opt);
  97. BPTR LockMsgBase(void);
  98. void InitStats(void);
  99. void InitHeader();
  100. void LoadUser(char *str);
  101. void LastCommand(void);
  102. BOOL expert=FALSE;
  103. char Upload_To[200];
  104. int Security;
  105. int node;
  106. char BBSloc[200];
  107. char OldConfName[200];
  108. char OldConfLoc[200];
  109. void Terminate(void);
  110. #define PRV_COMMAND 508
  111. main(int argc,char *argv[])
  112. {
  113.   char temp[200];
  114.   char t[200];
  115.   char BBName[400];
  116.   
  117.   long timeleft;
  118.   int stop;
  119.   if(argc!=2)
  120.   {
  121.     printf("AEConf version 1.1, written by Joseph Hodge\n");
  122.     printf("This is an AmiExpress 2.03+ (XIM)\n\n");
  123.     exit(0);
  124.   }
  125.   Register(argv[1][0]-'0');node=argv[1][0]-'0';
  126.   gu(temp,DT_SECSTATUS); Security=atoi(temp);
  127.   gu(temp,DT_EXPERT);
  128.   if(temp[0]=='X') expert=TRUE;
  129.   gu(BBSloc,BB_LOCAL);gu(NetAddress,JH_BBSName);
  130.   gu(OldConfName,BB_CONFNAME);
  131.   gu(OldConfLoc,BB_CONFLOCAL); 
  132.  gu(temp,BB_MAINLINE);
  133.  
  134.   while(1)
  135.   { stop=0;
  136.     Conf=atoi(&temp[1]);
  137.     if(Conf==0 && (temp[0]=='J' || temp[0]=='j'))
  138.     {
  139.       while(1)
  140.       {
  141.         sprintf(t,"%sNode%d/JoinConf",BBSloc,argv[1][0]-'0');
  142.         showgfile(t);
  143.         pm("Conference Number: ",t,10);
  144.         Conf=atoi(t);
  145.         if(Conf==0) continue; 
  146.         else{sprintf(temp,"J %d",Conf); break;}
  147.       }
  148.     }
  149.     if(Conf<=9)
  150.     {
  151.       //strcpy(temp,"J");
  152.       
  153.       pu(temp,RETURNCOMMAND);
  154.       
  155.       Terminate();
  156.       end();
  157.     }
  158.     
  159.     Conf -=9;
  160.     sprintf(t,"%sCustomConf",BBSloc);
  161.     if(!GetConf(t,Conf))
  162.     {
  163.       strcpy(temp,"J 0"); continue;
  164.     }
  165.     if(Security<255)
  166.     {
  167.       if(!Allowed())
  168.       {
  169.         sm("",1);
  170.         sm("Sorry, Conference Access denied!",1);
  171.         sm("",1);strcpy(temp,"J 0"); 
  172.         Pause(); sm("",1); continue;
  173.       }
  174.       
  175.     }
  176.     InitHeader();
  177.     InitStats();
  178.     sm("",1);sm("",1);
  179.     sm("Joining Conference",0);
  180.     sm(ConfName,1);
  181.     sm("",1);
  182.     GetHighMsg(LOCK);
  183.     InitUser();
  184.     ActiveConf=1;
  185.     sprintf(t,"%sBULL",ConfLoc);
  186.     pu(ConfName,BB_CONFNAME);
  187.     pu(ConfLoc,BB_CONFLOCAL);
  188.     if(CheckToDisplay(t)) Pause();
  189.     sm("",1);
  190.     sm("Highest Msg",0);
  191.     sprintf(t,"%ld",Stats.NMsg-1L);
  192.     sm(t,1);
  193.     sm("L/Msg. Read",0);
  194.     sprintf(t,"%ld",U.LastMsg);
  195.     sm(t,1);
  196.     sm("L/Msg. Auto",0);
  197.     sprintf(t,"%ld",U.AutoMsg);
  198.     sm(t,1);
  199.     sm("",1);
  200.     sm("",1);
  201.     
  202.     while(1)
  203.     {
  204.       if(!expert)
  205.       {
  206.         Pause();
  207.         
  208.         sm("",1);
  209.         sprintf(t,"%sMenu",ConfLoc);
  210.         showgfile(t);
  211.       }
  212.       gu(t,JH_BBSName);gu(temp,DT_TIMELIMIT); timeleft=atol(temp);gu(temp,DT_TIMEUSED);
  213.       timeleft -=atol(temp); 
  214.       sprintf(BBName,"%s [%d:%s] Menu (%ld mins. left): ",
  215.           t,Conf+9,ConfName,timeleft/60L);
  216.       pm(BBName,temp,200);
  217.       strupr(temp);
  218.       if(temp[0]=='\0' || temp[0]==' ') { sm("",1); continue; }
  219.       switch(temp[0])
  220.       {
  221.         //case 'Q': sm("",1);ShutDown(); end(); break;
  222.         case 'J': stop=1;break;
  223.         case 'E': Editor(); break;
  224.         case 'R': if(temp[1]=='Z')
  225.                    pu(temp,PRV_COMMAND); 
  226.                   else ReadMsg(temp);  break;
  227.         case 'N': if(temp[1]=='E') { GiveNet(); break;}
  228.                   pu(temp,PRV_COMMAND); break;
  229.         case 'G': stop=1; break;
  230.         case 'C': Editor(); break;
  231.         case 'M': if(temp[1]=='C' || temp[1]=='E') Edit();
  232.                   else pu(temp,PRV_COMMAND); break;
  233.         case 'Z': if(temp[1]=='O'){
  234.                   sm("",1); sm("Zoom not allowed in Net conferences",1);}
  235.                   else pu(temp,PRV_COMMAND); break;
  236.         default:
  237.            pu(temp,PRV_COMMAND);
  238.       }
  239.       sm("",1);
  240.       if(stop) break;
  241.     }
  242.     if(temp[0]=='\0') { Terminate(); end(); }
  243.   }
  244.   
  245.   Terminate();
  246.   end();
  247. }
  248. void GiveNet()
  249. {
  250.   FILE *fi,*fo;
  251.   char image[200];
  252.   char t[200];
  253.   char filename[200];
  254.   char temp[200];
  255.   char opt[10];
  256.   while(1)
  257.   {
  258.   sm("",1);
  259.   sm("NetWork Master Control",1);
  260.   sm("",1);
  261.   sm(" 1> Show NetLog",1);
  262.   sm(" 2> Show NetAccess",1);
  263.   sm(" 3> PackNet",1);
  264.   sm(" 4> UnPackNet",1);
  265.   if(Security==255)
  266.   {
  267.   sm("   --v--sysop only--v--",1);
  268.   sm(" 5> Add NetAcess",1);
  269.   sm(" 6> Remove NetAccess",1);
  270.   sm(" 7> Delete NetLog",1);
  271.   sm(" 8> Delete NetAccess",1);
  272.   }
  273.   sm(" Q> Exit Net control",1);
  274.   hk("  >:",opt); opt[1]='\0';
  275.   sm(opt,1);
  276.   switch(opt[0])
  277.   {
  278.     case '1': sprintf(image,"%sNet/NetLog",ConfLoc);
  279.               CheckToDisplay(image); break;
  280.     case '5': if(Security!=255) break;pm("   Enter Handle >:",image,30);strupr(image);
  281.               if(LookUp(image))
  282.               {
  283.                 pm("   Enter Net BBS Name >:",t,30);
  284.                 sprintf(filename,"%-30.30s-%-30.30s",image,t);
  285.                 sprintf(image,"%sNet/NetAccess.txt",ConfLoc);
  286.                 fi=fopen(image,"a");
  287.                 fprintf(fi,"%s\n",filename);
  288.                 fclose(fi);
  289.               }
  290.               else sm("Can't locate account",1);
  291.               break;
  292.     case '6': if(Security!=255) break;pm("   Enter Handle >:",image,30);strupr(image);
  293.               if(LookUp(image))
  294.               {
  295.                 strupr(image);
  296.                 sprintf(filename,"%s/Net/NetAccess.old",ConfLoc);
  297.                 if(TLock(filename)) DeleteFile(filename);
  298.                 sprintf(t,"%s/Net/NetAccess.txt",ConfLoc);
  299.                 if(TLock(t))
  300.                 {
  301.                   Rename(t,filename);
  302.                   fi=fopen(filename,"r");fo=fopen(t,"w");
  303.                   while(fgets(t,80,fi)!=NULL)
  304.                   {
  305.                     sr(t); strcpy(temp,t); temp[29]='\0'; sr(temp);
  306.                     strupr(temp);
  307.                     if(strcmp(temp,image)) fprintf(fo,"%s\n",t);
  308.                   }
  309.                   fclose(fi);
  310.                   fclose(fo);
  311.                   DeleteFile(filename);
  312.                 }
  313.               }
  314.               break;
  315.     case '2': sprintf(t,"%sNet/NetAccess",ConfLoc);sm("",1); CheckToDisplay(t);
  316.               break;
  317.     case '3': PackNet(); break;
  318.     case '4': UnPackNet(); break;
  319.     case '7': if(Security!=255) break;
  320.               sprintf(image,"%sNet/NetLog.txt",ConfLoc); 
  321.               if(TLock(image)) DeleteFile(image);
  322.               break;
  323.     case '8': if(Security!=255) break;
  324.               sprintf(image,"%sNet/NetAccess.txt",ConfLoc);
  325.               if(TLock(image)) DeleteFile(image); break;
  326.     case 'Q': return; break;
  327.     case 'q': return; break;
  328.    }
  329.   }
  330. }              
  331. void PackNet()
  332. {
  333.    register int i;
  334.    long lock;
  335.    char Address[200];
  336.    char Name[200],NetName[200];
  337.    FILE *fi=NULL,*fi1=NULL,*fo1=NULL,*fi2=NULL;
  338.    char NetFileName[200];
  339.    char HeaderName[200];
  340.    char MsgName[200];
  341.    long NextPosition;
  342.    long PriorPosition;
  343.    long TimeVar;
  344.    int MsgCount=0;fi=NULL;
  345.    strcpy(Name,U.Handle);strupr(Name);
  346.    sprintf(Address,"%sNet/NetAccess.txt",ConfLoc);
  347.    if(!TLock(Address))
  348.    {
  349.      sm(" You are not on the NetAccess list",1);
  350.      return;
  351.    }
  352.    sprintf(NetFileName,"%sNode%d/PlayPen/NetMail.DAT",BBSloc,node);
  353.    sprintf(HeaderName,"%sMsgBase/HeaderFile",ConfLoc);
  354.    if(!TLock(HeaderName))
  355.    {
  356.      sm(" Sorry, there is no mail today",1);
  357.      return;
  358.    }
  359.    fi=fopen(Address,"r");
  360.    while(fgets(Address,80,fi)!=NULL)
  361.    {
  362.       sr(Address); strcpy(NetName,&Address[31]);
  363.       Address[30]='\0'; sr(Address);
  364.       
  365.       if(!strcmp(Address,Name))
  366.       {
  367.         lock=LockMsgBase();fclose(fi); fi=NULL;
  368.         fo1=fopen(NetFileName,"w");
  369.         fi1=fopen(HeaderName,"r+b");
  370.         fseek(fi1,(U.LastMsg-1L)*(long)sizeof(struct MyHeader),SEEK_SET);
  371.         PriorPosition=ftell(fi1);
  372.         while(fread((APTR)&Head,sizeof(struct MyHeader),1,fi1)!=NULL)
  373.         {
  374.           
  375.           NextPosition=ftell(fi1);
  376.           if(!Head.Deleted)
  377.           {
  378.             if(!strcmp(NetName,&Head.TNName) || Head.Type=='P')
  379.             {
  380.               if(Head.Type=='R' || !strcmp(NetName,&Head.TNName))
  381.               {
  382.                 fseek(fi1,PriorPosition,SEEK_SET);
  383.                 
  384.                 fwrite((APTR)&Head,sizeof(struct MyHeader),1,fi1);
  385.                 fseek(fi1,NextPosition,SEEK_SET);
  386.               }
  387.               sm(".",0);
  388.               fprintf(fo1,"BEGIN:\n");
  389.               fprintf(fo1," FROMNET  :%s\n",Head.FNName);
  390.               fprintf(fo1," TONET    :%s\n",Head.TNName);
  391.               fprintf(fo1," DATE     :%ld\n",time(NULL));
  392.               fprintf(fo1," RECEIVED :%ld\n",Head.Received);
  393.               fprintf(fo1," FROMUSER :%s\n",Head.FName);
  394.               fprintf(fo1," TOUSER   :%s\n",Head.TName);
  395.               fprintf(fo1," SUBJECT  :%s\n",Head.Subject);
  396.               fprintf(fo1," TYPE     :%c\n",Head.Type);
  397.               fprintf(fo1," ----------\n");
  398.               MsgCount +=1;
  399.               Head.Received=time(NULL);
  400.               sprintf(MsgName,"%sMsgBase/%ld",ConfLoc,Head.MsgNum);
  401.               if(TLock(MsgName))
  402.               {
  403.                 fi2=fopen(MsgName,"r");
  404.                 while(fgets(MsgName,90,fi2)!=NULL)
  405.                 {
  406.                   fprintf(fo1," %s",MsgName);
  407.                 }
  408.                 fclose(fi2);
  409.               }
  410.               fprintf(fo1,"END:\n");
  411.            } PriorPosition=ftell(fi1);
  412.          }
  413.          U.LastMsg +=1L;
  414.        }
  415.        UnLock(lock);  
  416.        GetHighMsg(LOCK);
  417.        if(U.LastMsg>=Stats.NMsg) U.LastMsg=Stats.NMsg-1L;
  418.        fprintf(fo1,"TOTALMSG THIS PACKET: %5.5d FROM:%s\n",MsgCount,BBSloc);
  419.        fprintf(fo1,"PACKET FROM %s CONF:%s\n",NetAddress,ConfName);
  420.        fclose(fo1);fclose(fi1);
  421.        sprintf(NetFileName,"%sNet/NetLog.TXT",ConfLoc);
  422.        fi1=fopen(NetFileName,"a");
  423.        TimeVar=time(NULL);
  424.        sprintf(MsgName,"%s",ctime(&TimeVar));
  425.        MsgName[strlen(MsgName)-1]='\0';
  426.        fprintf(fi1,"%-20.20s >%5.5d Packed for %s\n",MsgName,MsgCount,NetName);
  427.        fprintf(fi1,"                     >by %s\n",Name);
  428.        fclose(fi1);
  429.        
  430.      }
  431.      if(fi==NULL) break;
  432.    }
  433.    if(fi!=NULL) fclose(fi);
  434.    sm("",1);
  435.    sprintf(MsgName,"TOTAL MESSAGES PACKED :%5.5d",MsgCount);
  436.    sm(MsgName,1); sm("",1);
  437.    if(MsgCount>0)
  438.    {
  439.      sm("Do you wish to download this PACKET ",0);
  440.      if(YesNo(1)) 
  441.      {
  442.        sprintf(NetFileName,"%sNode%d/PlayPen/NetMail.DAT",BBSloc,node);
  443.        sm("Prepare for Zmodem Download",1);
  444.        Pause();
  445.        sm("",1);
  446.        pu(NetFileName,ZMODEMSEND); DeleteFile(NetFileName);
  447.      }
  448.    }
  449. }
  450. void UnPackNet()
  451. {
  452.    register int i;
  453.    long lock;
  454.    char Address[200];
  455.    char Name[200],NetName[200],NetMail[200];
  456.    FILE *fi=NULL,*fi1=NULL,*fo1=NULL,*fo2=NULL,*fo3=NULL;
  457.    char NetFileName[200];
  458.    char HeaderName[200];
  459.    char MsgName[200];
  460.    char Location[200];
  461.    long NextPosition;
  462.    long PriorPosition;
  463.    long TimeVar;
  464.    int MsgCount=0;fi=NULL;
  465.    strcpy(Name,U.Handle);strupr(Name);
  466.    sprintf(Address,"%sNet/NetAccess.txt",ConfLoc);
  467.    if(!TLock(Address))
  468.    {
  469.      sm(" You are not on the NetAccess list",1);
  470.      return;
  471.    }
  472.    sprintf(NetFileName,"%sNode%d/PlayPen/NetMail.DAT",BBSloc,node);
  473.    
  474.    sprintf(HeaderName,"%sMsgBase/HeaderFile",ConfLoc);
  475.    fi=fopen(Address,"r");
  476.    while(fgets(Address,80,fi)!=NULL)
  477.    {
  478.       sr(Address); strcpy(NetName,&Address[31]);
  479.       Address[30]='\0'; sr(Address);
  480.       strupr(Address);
  481.       if(!strcmp(Address,Name))
  482.       {
  483.         fclose(fi); fi=NULL;
  484.         if(!TLock(NetFileName))
  485.         {
  486.           sm("Do you wish to upload NetMail.Dat ",0);
  487.           if(YesNo(1))
  488.           {
  489.             sprintf(NetName,"%sNode%d/PlayPen/",BBSloc,node);
  490.             sm("Prepare for Zmodem Upload",1);
  491.             Pause();
  492.             sm("",1);
  493.             pu(NetName,ZMODEMRECEIVE);  sprintf(NetFileName,"%sNetMail.Dat",NetName);
  494.             if(!TLock(NetFileName))
  495.             {
  496.                sm("Can't locate NetMail.Dat",1);
  497.               return;
  498.             }
  499.           }
  500.           else
  501.           {
  502.             pm("Enter Path to NetMail.Dat >:",Address,80);
  503.             if(Address[0]!='\0')
  504.             { 
  505.               if(Address[strlen(Address)-1]!=':' && Address[strlen(Address)-1]!='/')
  506.                Address[strlen(Address)-1]='\0';
  507.             }
  508.             sprintf(NetFileName,"%sNetMail.Dat",Address);
  509.             if(!TLock(NetFileName))
  510.             {
  511.               sm("Can't locate NetMail.Dat",1);
  512.               return;
  513.             }
  514.           }
  515.         }
  516.         strcpy(Location,NetFileName);
  517.         lock=LockMsgBase();
  518.         GetHighMsg(NOLOCK); 
  519.         fi1=fopen(NetFileName,"r");
  520.         fo1=fopen(HeaderName,"ab");
  521.         Head.Received=0L;
  522.         fo2=NULL;
  523.         while(fgets(Address,90,fi1)!=NULL)
  524.         {
  525.           sr(Address);
  526.           if(!strnicmp(Address,"BEGIN:",6)) 
  527.           {
  528.             Head.MsgNum=Stats.NMsg; Stats.NMsg+=1L;
  529.             sprintf(NetName,"%sMsgBase/%ld",ConfLoc,Stats.NMsg-1L);
  530.             fo2=fopen(NetName,"w");continue;
  531.           }
  532.           if(!strnicmp(Address," FROMNET  :",11))
  533.           {
  534.             strcpy(Head.FNName,&Address[11]); continue;
  535.           }
  536.           if(!strnicmp(Address," TONET    :",11))
  537.           {
  538.             strcpy(Head.TNName,&Address[11]); continue;
  539.           }
  540.           if(!strnicmp(Address," DATE     :",11))
  541.           {
  542.             Head.Written=atol(&Address[11]); continue;
  543.           }
  544.           if(!strnicmp(Address," RECEIVED :",11))
  545.           {
  546.             Head.Received=atol(&Address[11]); continue;
  547.           }
  548.           if(!strnicmp(Address," FROMUSER :",11))
  549.           { 
  550.              strcpy(Head.FName,&Address[11]); continue;
  551.           }
  552.           if(!strnicmp(Address," TOUSER   :",11))
  553.           {
  554.              strcpy(Head.TName,&Address[11]); continue;
  555.           }
  556.           if(!strnicmp(Address," SUBJECT  :",11))
  557.           {
  558.              strcpy(Head.Subject,&Address[11]); continue;
  559.           }
  560.           if(!strnicmp(Address," TYPE     :",11))
  561.           {
  562.              Head.Type=Address[11]; continue;
  563.           }
  564.           if(!strnicmp(Address," ----------",11)) continue;
  565.           if(!strnicmp(Address,"END",3))
  566.           {
  567.             Head.Deleted=FALSE; Head.Net=TRUE;
  568.             fwrite((APTR)&Head,sizeof(struct MyHeader),1,fo1);
  569.             U.LastMsg +=1L;MsgCount +=1; if(fo2){fclose(fo2);fo2=NULL;}
  570.           
  571.             
  572.              continue;
  573.           };
  574.           if(!strnicmp(Address,"TOTAL",5)) continue;
  575.           if(!strnicmp(Address,"PACKET",5))
  576.           {
  577.               
  578.               sprintf(Name,"%sNet/NetLog.TXT",ConfLoc);
  579.              fo3=fopen(Name,"a");
  580.              TimeVar=time(NULL);
  581.              sprintf(MsgName,"%s",ctime(&TimeVar));
  582.              MsgName[strlen(MsgName)-1]='\0';
  583.              fprintf(fo3,"%-20.20s >%5.5d unpacked from\n",MsgName,MsgCount);
  584.              fprintf(fo3,"                     >%s\n",&Address[12]);
  585.              fprintf(fo3,"                     >by %s\n",U.Handle);
  586.               fclose(fo3);
  587.             sprintf(MsgName,"TOTAL MESSAGES UNPACKED :%5.5d",MsgCount);
  588.             sm(MsgName,1); sm("",1);
  589.             MsgCount=0;
  590.              continue;
  591.           }
  592.           if(fo2)fprintf(fo2,"%s\n",&Address[1]);
  593.         }
  594.         fclose(fi1);
  595.         fclose(fo1);
  596.         if(fo2)fclose(fo2);
  597.         sprintf(NetMail,"%sMsgBase/MailStats",ConfLoc);
  598.         fi1=fopen(NetMail,"wb"); fwrite((APTR)&Stats,sizeof(struct MyStats),1,fi1);
  599.         fclose(fi1);
  600.         if(lock)UnLock(lock);
  601.         DeleteFile(Location);
  602.  
  603.      }
  604.      if(fi==NULL) break;
  605.    }
  606.    if(fi!=NULL) fclose(fi);
  607.    sm("",1);
  608.    //sprintf(MsgName,"TOTAL MESSAGES UNPACKED :%5.5d",MsgCount);
  609.    //sm(MsgName,1); sm("",1);
  610. }
  611.    
  612. void Upload_A_File(int opt)
  613. {
  614.   /* 
  615.    char Desc[8][50];
  616.    char CMD[200];
  617.    char temp[200];
  618.    if((dir_info =(struct FileInfoBlock *)AllocMem((long)sizeof(struct FileInfoBlock),0L)) == NULL)
  619.    {
  620.      sm("Memory Allocation Error. Please Leave message with Sysop",1);
  621.      Delay(300L);
  622.      return;
  623.    }
  624.    if(!opt)
  625.    {
  626.       sm("Zmodem Upload selected.",1); Pause();
  627.       sm("",1);
  628.       pu(Upload_To,ZMODEMRECEIVE);
  629.    }
  630.    if (! (pdir=(struct FileLock *)Lock(Upload_To,(ULONG)ACCESS_READ)) )
  631.   {
  632.     free_pdir();
  633.       return;
  634.   }
  635.   if ( ! Examine((BPTR)pdir, dir_info) )
  636.   {
  637.     free_pdir();
  638.     return;
  639.   }
  640.   while(ExNext((BPTR)pdir,dir_info))
  641.   {
  642.     if(dir_info->fib_DirEntryType < 0L )
  643.     {
  644.       
  645.       sprintf(CMD,"%-12s P %7ld    ",dir_info->fib_FileName,dir_info->fib_Size);
  646.       SM(CMD,0); 
  647.    }
  648.     else
  649.     {
  650.       sprintf(CMD,"%-25s           ",dir_info->fib_FileName);
  651.       SM(CMD,0);
  652.     }
  653.     j++;
  654.     if(j==2)
  655.     {
  656.       j=0;
  657.       SM("",1);
  658.       i++;
  659.     }
  660.     SM("",0);
  661.     if(i>17)
  662.     {
  663.       while(1)
  664.       {
  665.          HK("\r\nPress <Q>uit <F>lag,  <RETURN> to continue listing >:",CMD);
  666.          strupr(CMD);  
  667.      switch(CMD[0])
  668.       {
  669.          case 'Q': 
  670.           SM("Quit.",1);
  671.           free_pdir();
  672.           return;
  673.          case 'F': SM("Flag.",1);
  674.           Flag(); break;
  675.          default: SM("Continue.",1); break;
  676.       }
  677.      
  678.       if(ch!='F') break; 
  679.      } 
  680.      i=0;
  681.     }
  682.   }
  683.     while(1)
  684.     {
  685.         HK("\r\nPress <F>lag,  <RETURN> to exit listing >:",CMD);strupr(CMD);
  686.       switch(CMD[0])
  687.       {
  688.          case 'Q': 
  689.           SM("Quit.",1);
  690.           free_pdir();
  691.           return;
  692.          case 'F': SM("Flag.",1);
  693.           Flag(); break;
  694.          default: SM("Continue.",1); free_pdir(); return;
  695.       }
  696.      
  697.       if(ch!='F') break; 
  698.      } 
  699.   */
  700. }
  701.  
  702. /*******************************************************/
  703.  
  704. void free_pdir()
  705. {
  706.    if ( pdir )
  707.       {
  708.       UnLock((BPTR)pdir);
  709.       pdir=NL;
  710.        }
  711.    return;   
  712. }
  713. void InitHeader()
  714. {
  715.   strcpy(Head.FName,"");
  716.   strcpy(Head.TName,"");
  717.   strcpy(Head.Subject,"");
  718.   strcpy(Head.TNName,"");
  719.   strcpy(Head.FNName,"");
  720.   Head.Net=FALSE;
  721.   Head.MsgNum=-1L;
  722.   Head.Received=0L;
  723.   Head.Written=0L;
  724.   Head.Type=' ';
  725.   Head.Deleted=FALSE;
  726. }
  727. void InitStats(void)
  728. {
  729.   Stats.NMsg=1L;
  730. }
  731.  
  732. BPTR LockMsgBase(void)
  733. {
  734.   char GSTR3[200];
  735. BPTR lock;
  736. UWORD loop=0;
  737. LONG error;
  738. sprintf(GSTR3,"%sMsgBase/MailLock",ConfLoc);
  739. do
  740.     {
  741.     lock=Lock(GSTR3,ACCESS_WRITE);
  742.     if(!lock)
  743.         {
  744.         error=IoErr();
  745.         if(error==205)
  746.             {
  747.             CreateFile(GSTR3); continue;
  748.             }
  749.         }
  750.     if(!lock)
  751.         {
  752.         Delay(120L);
  753.         sm(".",0);
  754.         }
  755.     } while(!lock&&loop++<30);
  756. if(loop) sm("",1);
  757. return(lock);
  758. }
  759. BPTR LockUserBase(void)
  760. {
  761.   char GSTR3[200];
  762. BPTR lock;
  763. UWORD loop=0;
  764. LONG error;
  765. sprintf(GSTR3,"%sUser.lock",ConfLoc);
  766. do
  767.     {
  768.     lock=Lock(GSTR3,ACCESS_WRITE);
  769.     if(!lock)
  770.         {
  771.         error=IoErr();
  772.         if(error==205)
  773.             {
  774.             CreateFile(GSTR3);
  775.             }
  776.         }
  777.     if(!lock)
  778.         {
  779.         Delay(120L);
  780.         sm(".",0);
  781.         }
  782.     } while(!lock&&loop++<30);
  783. if(loop) sm("",1);
  784. return(lock);
  785. }
  786. void GetHighMsg(int opt)
  787. {
  788.   char t[200];
  789.   long lock;
  790.   FILE *fi;
  791.   if(opt)
  792.   {
  793.   lock=LockMsgBase(); 
  794.   if(!lock)
  795.   {
  796.     sm(" Error, can't lock msgbase",1);
  797.     Terminate();
  798.     end();
  799.   }
  800.   }
  801.   sprintf(t,"%sMsgBase/MailStats",ConfLoc);
  802.   if(!TLock(t))
  803.   {
  804.     fi=fopen(t,"wb");
  805.     fwrite((APTR)&Stats,sizeof(struct MyStats),1,fi);
  806.     fclose(fi);
  807.     if(opt)UnLock(lock);
  808.     return;
  809.   }
  810.   fi=fopen(t,"rb");
  811.   fread((APTR)&Stats,sizeof(struct MyStats),1,fi);
  812.   fclose(fi);
  813.   if(opt)UnLock(lock);
  814. }
  815.   
  816. int GetConf(char *str,int num)
  817. {
  818.    register int i=0;
  819.    FILE *fi;
  820.    char t[200];
  821.    num -=1;
  822.    if(!TLock(str)) return(0);
  823.    fi=fopen(str,"r");
  824.    while(fgets(t,80,fi)!=NULL)
  825.    {
  826.      sr(t);
  827.      if(i==num)
  828.      {
  829.        fclose(fi);
  830.        if(strlen(t)<30)
  831.        {
  832.          sm("",1);
  833.          sm("",1);
  834.          sm(" Error, CustomConf is invalid",0);
  835.          sm("",1);
  836.          return(0);
  837.          //ShutDown();
  838.          //end();
  839.        }
  840.        else
  841.        {
  842.        strcpy(ConfLoc,&t[29]);
  843. if(ConfLoc[strlen(ConfLoc)-1]!=':' && ConfLoc[strlen(ConfLoc)-1]!='/') 
  844.        strcat(ConfLoc,"/");
  845.        
  846.         Validate(ConfLoc);
  847.        strlim(ConfName,t,25);sr(ConfName);
  848.        
  849.        return(1);
  850.       }
  851.     }
  852.      i +=1;
  853.    }
  854.    fclose(fi);
  855.   // strcpy(t,"J");
  856.   // pu(t,RETURNCOMMAND);
  857.   // ShutDown();
  858.   // end();
  859.   return(0);
  860. }
  861. void Validate(char *str)
  862. {
  863.   char t[200];
  864.   long lock;
  865.   strcpy(t,str);
  866.   if(t[strlen(t)-1]=='/') t[strlen(t)-1]='\0';
  867.   if(!TLock(t)) { lock=CreateDir(t); 
  868.                   if(lock) UnLock(lock); 
  869.                   else
  870.                   {
  871.                   sm("Error can't create Conference",1);
  872.                   ShutDown();
  873.                   end();
  874.                   }
  875.                 }
  876.   sprintf(t,"%sUpload",str);
  877.   if(!TLock(t)){ lock=CreateDir(t); if(lock)UnLock(lock); }
  878.   sprintf(t,"%sPartUpload",str);
  879.   if(!TLock(t)){ lock=CreateDir(t); if(lock)UnLock(lock); }
  880.   sprintf(t,"%sMsgBase",str);
  881.   if(!TLock(t)){ lock=CreateDir(t); if(lock)UnLock(lock); }
  882.   sprintf(t,"%sBulletins",str);
  883.   if(!TLock(t)){ lock=CreateDir(t); if(lock)UnLock(lock); }
  884.   sprintf(t,"%sHold",str);
  885.   if(!TLock(t)){ lock=CreateDir(t); if(lock)UnLock(lock); }
  886.    sprintf(t,"%sNet",str);
  887.   if(!TLock(t)){ lock=CreateDir(t); if(lock)UnLock(lock); }
  888. }
  889.   
  890.     
  891. void InitUser()
  892. {
  893.   char temp[100];
  894.   gu(temp,DT_NAME);
  895.   strcpy(U.Handle,temp);
  896.   strcpy(U.Name,"");
  897.  
  898.   U.LastMsg=1L;
  899.   U.AutoMsg=0L;
  900.   U.MsgsPosted=0L;
  901.   U.Mail_Received=0L;
  902.   LoadUser(temp);
  903. }
  904. void LoadUser(char *str)
  905. {
  906.   long deleted=-1L;
  907.   FILE *fi;
  908.   long slot=0L;
  909.   struct User t;
  910.   char image[200];
  911.   long lock;
  912.   lock=LockUserBase();
  913.   sprintf(image,"%sUserBase",ConfLoc);
  914.   if(!lock)
  915.   {
  916.     sm("",1);
  917.     Terminate();
  918.     end();
  919.   }
  920.   if(!TLock(image))
  921.   {
  922.     U.Slot_Number=0L;
  923.     sprintf(image,"%sUserBase",ConfLoc);
  924.     fi=fopen(image,"wb");
  925.     fwrite((APTR)&U,sizeof(struct User),1,fi);
  926.     fclose(fi);
  927.     UnLock(lock);
  928.     return;
  929.   }
  930.   fi=fopen(image,"rb");
  931.   while(fread((APTR)&t,sizeof(struct User),1,fi)!=NULL)
  932.   {
  933.     if(!strcmp(t.Handle,str))
  934.     {
  935.        U=t; fclose(fi); if(lock)UnLock(lock); return;
  936.     }
  937.     if(t.Slot_Number==-1L && deleted==-1L) deleted=slot;
  938.     slot++;
  939.   }
  940.   fclose(fi);
  941.   if(deleted==-1L)
  942.   {
  943.     fi=fopen(image,"ab");
  944.     U.Slot_Number=slot;
  945.     fwrite((APTR)&U,sizeof(struct User),1,fi);
  946.     fclose(fi);
  947.   }
  948.   else
  949.   {
  950.     fi=fopen(image,"r+b");
  951.     U.Slot_Number=deleted;
  952.     fseek(fi,deleted*(long)sizeof(struct User),SEEK_SET);
  953.     fwrite((APTR)&U,sizeof(struct User),1,fi);
  954.     fclose(fi);
  955.   }
  956.   if(lock)UnLock(lock);
  957.   return;
  958.   
  959. }
  960. void SaveUser(void)
  961. {
  962.   long deleted=-1L;
  963.   FILE *fi;
  964.   long slot=0L;
  965.   struct User t;
  966.   char image[200];
  967.   long lock;
  968.   lock=LockUserBase();
  969.   sprintf(image,"%sUserBase",ConfLoc);
  970.   if(!lock)
  971.   {
  972.     sm("",1);
  973.     Terminate();
  974.     end();
  975.   }
  976.   fi=fopen(image,"r+b");
  977.   fseek(fi,U.Slot_Number*(long)sizeof(struct User),SEEK_SET);
  978.   fwrite((APTR)&U,sizeof(struct User),1,fi);
  979.   fclose(fi);
  980.   if(lock)UnLock(lock);
  981. }
  982. long LookUp(char *str)
  983. {
  984.   long deleted=-1L;
  985.   FILE *fi;
  986.   long slot=0L;
  987.   struct User t;
  988.   char image[200];
  989.   long lock;
  990.   lock=LockUserBase();
  991.   sprintf(image,"%sUserBase",ConfLoc);
  992.   if(!lock)
  993.   {
  994.     sm("",1);
  995.     Terminate();
  996.     end();
  997.   }
  998.   fi=fopen(image,"rb");
  999.   while(fread((APTR)&t,sizeof(struct User),1,fi)!=NULL)
  1000.   {
  1001.     strupr(&t.Handle);
  1002.     if(!strcmp(t.Handle,str) && t.Slot_Number!=-1L)
  1003.     {
  1004.        fclose(fi); UnLock(lock); return(slot+1);
  1005.     }
  1006.     slot++;
  1007.   }
  1008.   fclose(fi);
  1009.   UnLock(lock);
  1010.   return(0);
  1011.   
  1012. }
  1013. void end(void)
  1014. {
  1015.  if(ActiveConf){ CleanPlayPen();
  1016.   SaveUser();}
  1017.   exit(0);
  1018. }
  1019.  
  1020. void CleanPlayPen()
  1021. {
  1022.   char FileName[200];
  1023.   sprintf(FileName,"DELETE %sNode%d/PlayPen/#? QUIET",BBSloc,node);
  1024.   Execute(FileName,NULL,NULL);
  1025. }
  1026.  
  1027.  
  1028.  
  1029. /****************************** EDITOR **********************************/
  1030.  
  1031. void ReadMsg(char str1[])
  1032. {
  1033.   long lock;
  1034.   FILE *fi=NULL;
  1035.   long TimeVar;
  1036.   long oldmsg;
  1037.   BOOL mine=FALSE;
  1038.   char Name[40];
  1039.   char image[200];
  1040.   char date[100];
  1041.   char temp[255];
  1042.    char str[200];
  1043.   register int i;
  1044.   GetHighMsg(LOCK);
  1045.   U.LastMsg= atoi(&str1[1])==0 ? U.LastMsg:atoi(&str1[1]);
  1046.   strcpy(Name,U.Handle);
  1047.   strupr(Name);
  1048.   sprintf(image,"%sMsgBase/HeaderFile",ConfLoc);
  1049.   //if(U.LastMsg==Stats.NMsg-1L) return;
  1050.  
  1051.   while(U.LastMsg<Stats.NMsg)
  1052.   {
  1053.     if(U.LastMsg==0) U.LastMsg=1;
  1054.     mine=FALSE;
  1055.     lock=LockMsgBase();
  1056.     if(!lock)
  1057.     {
  1058.       sm(" Can't get lock on MsgBase",1); return;
  1059.     }
  1060.     fi=fopen(image,"r+b");
  1061.     fseek(fi,(U.LastMsg-1L)*sizeof(struct MyHeader),SEEK_SET);
  1062.     fread((APTR)&Head,sizeof(struct MyHeader),1,fi);
  1063.     strupr(Head.TName); strupr(Head.FName);
  1064.     if(!Head.Deleted)
  1065.     {
  1066.       if(!strcmp(Head.TName,Name) && Head.Received==NULL)
  1067.       {
  1068.         Head.Received=time(NULL);
  1069.         fseek(fi,(U.LastMsg-1L)*sizeof(struct MyHeader),SEEK_SET);
  1070.         fwrite((APTR)&Head,sizeof(struct MyHeader),1,fi);
  1071.         
  1072.       }
  1073.       
  1074.     }
  1075.     fclose(fi); fi=NULL;
  1076.     if(!Head.Deleted)BufferMsg(U.LastMsg);
  1077.     else
  1078.     {
  1079.       sprintf(str,"(%ld)",U.LastMsg);
  1080.      // U.LastMsg +=1L;
  1081.       sm("",1);
  1082.       sm("Message ",0);sm(str,0);sm(" is deleted.",1);
  1083.      // sm("",1); if(U.LastMsg>=Stats.NMsg) U.LastMsg=Stats.NMsg-1L;return;
  1084.     }
  1085.     if(lock)UnLock(lock);
  1086.     
  1087. if(!strcmp(Head.TName,Name) || !strcmp(Head.FName,Name))
  1088.       {
  1089.         mine=TRUE;
  1090.       }
  1091.       if(!mine && Head.Type=='R' && Security!=255)
  1092.       {
  1093.          sm(" Receiver Only ",1);
  1094.       }
  1095.       
  1096. NoPass:
  1097.  
  1098.     while(1)
  1099.     {
  1100.        if(!((!mine && Head.Type=='R' && Security!=255) || Head.Deleted))
  1101.        {
  1102.          TimeVar=Head.Written;
  1103.          sprintf(date,"%s",ctime(&TimeVar));
  1104.          date[strlen(date)-1]='\0';
  1105.          sprintf(str,"Date   %-30s  Number%ld",date,Head.MsgNum);
  1106.          sm("",1);
  1107.          sm(str,1);
  1108.          if(Head.Net)
  1109.          {
  1110.            sprintf(str,"ToNet  %-30s  FrmNet%-30.30s",Head.TNName,Head.FNName);
  1111.            sm(str,1);
  1112.          }
  1113.          sprintf(str,"To     %-30s  Recv'd: ",Head.TName);
  1114.          sm(str,0);
  1115.          if(!strcmp(Head.TName,"ALL"))
  1116.          {
  1117.            sm("N/A.",1);
  1118.          }
  1119.          else
  1120.          {
  1121.            if(Head.Received==NULL)
  1122.            {
  1123.              sm("No.",1);
  1124.            }
  1125.            else
  1126.            {
  1127.              TimeVar=Head.Received;
  1128.              sprintf(date,"%s",ctime(&TimeVar));
  1129.              date[strlen(date)-1]='\0';
  1130.              sm(date,1);
  1131.            }
  1132.          }
  1133.          sprintf(str,"From   %-30s  Status: ",Head.FName);
  1134.          sm(str,0);
  1135.          if(Head.Type=='P')
  1136.          {
  1137.            sm("Public Message.",1);
  1138.          }
  1139.          else sm("Receiver only.",1);
  1140.         
  1141.          sprintf(str,"Subject%-30s",Head.Subject);
  1142.          sm(str,1); sm("",1);
  1143.          i=0;
  1144.          while(i<Lines)
  1145.          {
  1146.            sm(MsgBuf[i],1);
  1147.            i++;
  1148.          }
  1149.        }
  1150.          sm("",1);
  1151.          if(U.LastMsg==Stats.NMsg-1L)
  1152.          strcpy(str,"QUIT");else
  1153.          sprintf(str,"%ld+%ld",U.LastMsg+1L,Stats.NMsg-1L); 
  1154.       if(mine || Security==255)
  1155.        {
  1156.     
  1157.        strcpy(temp,"A>gain D>elete R>eply");
  1158.         sm(temp,0);
  1159.         sprintf(temp," Q>uit <CR>=Next ( %s )?",str);
  1160.        } 
  1161.        else
  1162.        {
  1163.             strcpy(temp,"A>gain R>eply");
  1164.          sm(temp,0);
  1165.          sprintf(temp," Q>uit <CR>=Next ( %s )? ",str);
  1166.        }
  1167.        sm(temp,0);
  1168.        pm("",temp,10); strupr(temp);
  1169.        sm("",1);
  1170.        if(temp[0]=='R')
  1171.        {
  1172.          oldmsg=Head.MsgNum;
  1173.          if(Head.Net)strcpy(Head.TNName,Head.FNName);
  1174.          if(Head.Net)strcpy(Head.FNName,ConfName); 
  1175.          strcpy(Head.TName,Head.FName);
  1176.          strcpy(Head.FName,U.Handle);
  1177.          Head.Received=0L;
  1178.          MsgHeaders(0);
  1179.          ReplyMyMsg();
  1180.          if(Edit()==0) SaveMsg();
  1181.          if(mine)
  1182.          {
  1183.            sm("Delete orignial message ",0); 
  1184.            if(YesNo(2)) temp[0]='D';
  1185.          }
  1186.          if(temp[0]!='D')break; Head.MsgNum=oldmsg;
  1187.        }
  1188.  
  1189.        if((mine || Security==255) && temp[0]=='D')
  1190.        {
  1191.          Head.Deleted=TRUE;
  1192.          lock=LockMsgBase();
  1193.          if(!lock)
  1194.          {
  1195.            sm("  Error, can't lock msgbase",1);
  1196.          }
  1197.          else
  1198.          {
  1199.             sprintf(str,"%sMsgBase/%ld",ConfLoc,Head.MsgNum);
  1200.             DeleteFile(str);
  1201.             sprintf(str,"%sMsgBase/HeaderFile",ConfLoc);
  1202.             fi=fopen(str,"r+b");
  1203.             fseek(fi,(Head.MsgNum-1L)*(long)sizeof(struct MyHeader),SEEK_SET);
  1204.             fwrite((APTR)&Head,sizeof(struct MyHeader),1,fi);
  1205.             fclose(fi);
  1206.             if(lock)UnLock(lock);
  1207.             sm("   Message Deleted.",1);
  1208.             break;
  1209.          }
  1210.        }
  1211.        if(temp[0]=='Q' || temp[0]=='\0') break;
  1212.     }
  1213.     if(temp[0]=='Q') break;
  1214.     U.LastMsg +=1L;
  1215.     GetHighMsg(LOCK);
  1216.   }
  1217.   if(U.LastMsg>=Stats.NMsg) U.LastMsg=Stats.NMsg-1L;
  1218. }
  1219. void ReplyMyMsg()
  1220. {
  1221.   int i,i1,i2,i3;
  1222.   char str[200];
  1223.     sm("  Quote in Reply ",0);
  1224.     stats=YesNo(2);
  1225.     if(stats<0)  return;
  1226.     sm("",1);
  1227.      //Lines=0;
  1228.      //while(MsgBuf[Lines][0]!='\0') Lines++;
  1229.     for(i=0; i<Lines; i++)
  1230.         {
  1231.         sprintf(str,"%2d> %s",i+1,MsgBuf[i]);
  1232.         sm(str,1);
  1233.         }
  1234.     for(;;)
  1235.         {
  1236.                   sm("",1);
  1237.         sm(" Enter Startline,Endline or (*=ALL, A=Abort): ",0);
  1238.         pm("",str,6);
  1239.         stats=str[0];
  1240.         if(stats=='A'||stats=='a')
  1241.             {
  1242.             i=(-1);
  1243.             Lines=0;
  1244.             break;
  1245.             }
  1246.         if(stats=='*')
  1247.             {
  1248.             i=1;
  1249.             i2=Lines;
  1250.             }
  1251.         else
  1252.             {
  1253.             sscanf(str,"%d,%d",&i,&i2);
  1254.             }
  1255.         if((i>0&&i<=Lines)&&(i2>0&&i2<=Lines)&&(i<=i2))
  1256.             {
  1257.             break;
  1258.             }
  1259.         }
  1260.     if(i!=(-1))
  1261.         {
  1262.         for(i3=0; i3<=(i2-i); i3++)
  1263.             {
  1264.             if(i3<98)
  1265.                 {
  1266.                 MsgBuf[i+i3-1][78]='\0';
  1267.                 sprintf(str,">%s",MsgBuf[i+i3-1]);
  1268.                 strcpy(MsgBuf[i3],str);
  1269.                 }
  1270.             }
  1271.         if(i3<98)
  1272.             {
  1273.             Lines=i3;
  1274.             }
  1275.         else
  1276.             {
  1277.             Lines=98;
  1278.             }
  1279.         strcpy(MsgBuf[Lines++]," ");
  1280.         MsgBuf[Lines][0]='\0';
  1281.         }
  1282.     else
  1283.         {
  1284.         for(i=0; i<100; i++)
  1285.             {
  1286.             MsgBuf[i][0]='\0';
  1287.             }
  1288.         }
  1289. }
  1290. void BufferMsg(long msg)
  1291. {
  1292.   FILE *fi;
  1293.   char image[100];
  1294.  
  1295.   register int i=0;
  1296.   InitBuffer();
  1297.   Lines=0;
  1298.   sprintf(image,"%sMsgBase/%ld",ConfLoc,msg);
  1299.   if(!TLock(image))
  1300.   {
  1301.     strcpy(MsgBuf[0],"Can't locate message");
  1302.     return;
  1303.   }
  1304.   fi=fopen(image,"r");
  1305.   while(fgets(image,80,fi)!=NULL)
  1306.   {
  1307.      sr(image);
  1308.      strcpy(MsgBuf[i],image);
  1309.      i++; Lines++;
  1310.      if(i==99) break;
  1311.   }
  1312.   fclose(fi);
  1313. }
  1314.      
  1315. void Editor()
  1316. {
  1317.   Lines=0;
  1318.   if(MsgHeaders(1)) if(Edit()==0) SaveMsg();
  1319. }
  1320.  
  1321. void SaveMsg()
  1322. {
  1323.   long lock;
  1324.   char image[200];
  1325.   int i=0;
  1326.   FILE *fi;
  1327.   
  1328.   GetHighMsg(LOCK);
  1329. lock=LockMsgBase();
  1330.   if(!lock)
  1331.   {
  1332.     sm("",1);
  1333.     sm("   Error can't access msgbase. Message not saved",1);
  1334.     return;
  1335.   }
  1336.   Head.MsgNum=Stats.NMsg;
  1337.   if(Head.TNName[0]!=NULL)
  1338.   {
  1339.     Head.Net=TRUE;
  1340.   }
  1341.   Head.Deleted=FALSE;
  1342.   Head.Written=time(NULL);
  1343.   Head.Received=0L;
  1344.   sprintf(image,"%sMsgBase/HeaderFile",ConfLoc);
  1345.   fi=fopen(image,"ab");
  1346.   fwrite((APTR)&Head,sizeof(struct MyHeader),1,fi);
  1347.   fclose(fi);
  1348.   Stats.NMsg+=1;
  1349.   sprintf(image,"%sMsgBase/MailStats",ConfLoc);
  1350.   fi=fopen(image,"wb");
  1351.   fwrite((APTR)&Stats,sizeof(struct MyStats),1,fi);
  1352.   fclose(fi);
  1353.   if(lock)UnLock(lock);
  1354.   sprintf(image,"%sMsgBase/%ld",ConfLoc,Head.MsgNum);
  1355.   fi=fopen(image,"w");
  1356.   while(i<Lines)
  1357.   {
  1358.     fprintf(fi,"%s\n",MsgBuf[i]);
  1359.     i++;
  1360.   }
  1361.   fclose(fi);
  1362.   sprintf(image,"%ld",Head.MsgNum);
  1363.   sm("",1);
  1364.   sm("     Saving message number (",0);
  1365.   sm(image,0);sm(").",1);
  1366.   sm("",1);
  1367. }
  1368. int MsgHeaders(int opt)
  1369. {
  1370.    MsgNetHeader(opt);
  1371.   if(!MsgToHeader(opt)) return(0);
  1372.   if(!MsgSubjectHeader(opt)) return(0);
  1373.   MsgReceiveHeader();
  1374.   return(1);
  1375. }
  1376. void MsgReceiveHeader()
  1377. {
  1378.   if(!strcmp(Head.TName,"ALL")) { Head.Type='P';return;}
  1379.    sm("   Receiver only ",0); if(!YesNo(2)) Head.Type='P';
  1380.    else Head.Type='R';
  1381. }  
  1382.  
  1383. void MsgNetHeader(int opt)
  1384. {
  1385.  char temp[200];
  1386.  sm("",1);
  1387.  sm("                       (------------------------------)",1);
  1388.  sm("    Net(Enter)='N/A'? ",0);
  1389.  if(opt)
  1390.  { 
  1391.    pm("",temp,29); strcpy(&Head.TNName,temp);
  1392.    strcpy(&Head.FNName,NetAddress); 
  1393.  }
  1394.  else sm(Head.TNName,1);
  1395. }
  1396. int MsgToHeader(int opt)
  1397. {
  1398.  char temp[200];
  1399.  sm("     To(Enter)='ALL'? ",0);
  1400.  if(opt)
  1401.  {
  1402.    pm("",temp,29);
  1403.    strcpy(&Head.FName,U.Handle);
  1404.    if(temp[0]=='\0') { strcpy(&Head.TName,"ALL"); return(1);}else strcpy(&Head.TName,temp);
  1405.    strupr(&Head.TName);
  1406.    if(!strcmp(&Head.TName,"ALL")) return(1);
  1407.    if(Head.TNName[0]==NULL)
  1408.    if(!LookUp(&Head.TName))
  1409.    {
  1410.      sm("",1);
  1411.      sm("    User does not have access to this conference",1);
  1412.      sm("",1);
  1413.      return(0);
  1414.    }
  1415.  }
  1416.  else sm(Head.TName,1);
  1417.  return(1);
  1418. }
  1419. int MsgSubjectHeader(int opt)
  1420. {
  1421.  char temp[200];
  1422.  sm("Subject(Blank)=abort? ",0);
  1423.  if(opt)pm("",temp,29);
  1424.  else li(Head.Subject,temp,29);
  1425.  //sm("",1);
  1426.  if(opt)
  1427.  if(temp[0]=='\0') return(0);
  1428.  strcpy(Head.Subject,temp);
  1429.  return(1);
  1430. }
  1431. void InitBuffer()
  1432. {
  1433.   register int i=0;
  1434.   while(i<99)
  1435.   {
  1436.     strcpy(MsgBuf[100],"");
  1437.     i++;
  1438.   }
  1439. }
  1440.  
  1441. int Edit(void)
  1442. {
  1443. register int c;
  1444. int cn,j,x,back,BKFlag;
  1445. static char str[200],SPACE[90],str2[10],temp[170];
  1446. char t[10];
  1447. /* Clear msg buffer */
  1448. InitBuffer();
  1449. str[0]='\0';
  1450. x=0;
  1451. BKFlag=0;
  1452.  
  1453. sm("",1);
  1454. sm("   Enter your text. (Enter) alone to end. (75 chars/line, 100 lines, max)",1);
  1455. sm("   (*-------*-------*-------*-------*-------*-------*-------*-------*-------*--)",1);
  1456.  
  1457. if(Lines!=0)
  1458.     {
  1459.     for(j=0; j<Lines; j++)
  1460.         {
  1461.         sprintf(SPACE,"%2d> %s",j+1,MsgBuf[j]);
  1462.         sm(SPACE,1);
  1463.         }
  1464.     }
  1465.  
  1466. SPACE[0]='\0';
  1467.  
  1468. do
  1469.     {
  1470.     BEG_IN:
  1471.     strcpy(MsgBuf[Lines],SPACE);
  1472.     sprintf(str,"%2d> %s",Lines+1,MsgBuf[Lines]);
  1473.     sm(str,0);
  1474.     for(;;)
  1475.         {
  1476.         Next2:
  1477. //        c=Check_Online_Status();
  1478. //        if(c<0) { return(c); }
  1479.           hk("",t);c=t[0];
  1480. //        c=ReadChar(KEYBOARD_TIMEOUT);
  1481.         if(c<0) { return(c); }
  1482.         if(c=='\r')
  1483.             {
  1484.             if(SPACE[0]=='\0')
  1485.                 {
  1486.                 MsgBuf[Lines][0]='\0';
  1487.                 BKFlag=1;
  1488.                 break;
  1489.                 }
  1490.             strcpy(MsgBuf[Lines],SPACE);
  1491.             SPACE[0]='\0';
  1492.             sm("",1);
  1493.             x=0;
  1494.             break;
  1495.             }
  1496.         if(c=='\30')
  1497.             {
  1498.             while(x)
  1499.                 {
  1500.                 sm("\b \b",0);
  1501.                 --x;
  1502.                 }
  1503.             SPACE[x]='\0';
  1504.             goto Next2;
  1505.             }
  1506.         if(c=='\b' || c=='\177')
  1507.             {
  1508.             if(x>0)
  1509.                 {
  1510.                 x-=1;
  1511.                 SPACE[x]='\0';
  1512.                 sm("\b \b",0);
  1513.                 goto Next2;
  1514.                 }
  1515.             goto Next2;
  1516.             }
  1517.         if(c=='\t')
  1518.             {
  1519.             c=x%8;
  1520.             if(x+(8-c)>72)
  1521.                 {
  1522.                 c='\t';
  1523.                 }
  1524.             else
  1525.                 {
  1526.                 for(;c<8; c++)
  1527.                     {
  1528.                     str2[0]=(char)' ';
  1529.                     str2[1]='\0';
  1530.                     sm(" ",0);//sendchar(' ');
  1531.                     strcat(SPACE,str2);
  1532.                     x++;
  1533.                     }
  1534.                 }
  1535.             }
  1536.         if(c<' ')
  1537.             {
  1538.             goto Next2;
  1539.             }
  1540.         x+=1;
  1541.         sm(t,0);//sendchar(c);
  1542.         str2[0]=(char)c;
  1543.         str2[1]='\0';
  1544.         strcat(SPACE,str2);
  1545.         if(x>75)
  1546.             {
  1547.             back=0;
  1548.             for(cn=x; cn>=0; cn--)
  1549.                 {
  1550.                 if(SPACE[cn-1]==' ')
  1551.                     {
  1552.                     back=x-cn;
  1553.                     SPACE[cn-1]='\0';
  1554.                     break;
  1555.                     }
  1556.                 }
  1557.             if(back==0)
  1558.                 {
  1559.                 strcpy(MsgBuf[Lines],SPACE);
  1560.                 sm("",1);
  1561.                 SPACE[0]='\0';
  1562.                 x=0;
  1563.                 break;
  1564.                 }
  1565.             str[0]='\0';
  1566.             for(cn=(x-back); cn<x; cn++)
  1567.                 {
  1568.                 str2[0]=SPACE[cn];
  1569.                 str2[1]='\0';
  1570.                 strcat(str,str2);
  1571.                 }
  1572.             x=strlen(str);
  1573.             strcpy(MsgBuf[Lines],SPACE);
  1574.             strcpy(SPACE,str);
  1575.             for(cn=0; cn<x; cn++)
  1576.                 {
  1577.                 sm("\b \b",0);
  1578.                 }
  1579.             sm("",1);
  1580.             break;
  1581.             }
  1582.         }
  1583.     Lines+=1;
  1584.     if(Lines==98&&BKFlag==0)
  1585.         {
  1586.            sm("",1);
  1587.         sm("Warning two lines remaining.",1);sm("",1);
  1588.         }
  1589.     } while(BKFlag==0&&Lines<100);
  1590. if(Lines<100)
  1591.     {
  1592.     Lines-=1;
  1593.     }
  1594. else
  1595.     {
  1596.     Lines=100;
  1597.     }
  1598. sm("",1);
  1599.  
  1600. do
  1601.     {
  1602.       sm("",1);
  1603.      sm("A)bort, C)ont, D)elete,",0);sm(" E)dit, F)ile, L)ist, S)ave Option? ",0);
  1604.      pm("",str,10);
  1605.     if(str[0]=='D'||str[0]=='d')
  1606.         {
  1607.         do
  1608.             {
  1609.             if(Lines==0)
  1610.                 {
  1611.                     sm("",1);
  1612.                 sm("No lines to delete.",1);
  1613.                 stats=0;
  1614.                 break;
  1615.                 }
  1616.             sprintf(str,"Line number to delete [1..%d]? ",Lines);
  1617.                sm("",1);
  1618.             sm(str,0);
  1619.             pm("",str,5);stats=atoi(str);
  1620.             if(stats<0) { break; }
  1621.             if(str[0]=='\0') { stats=0; break; }
  1622.             sscanf(str,"%d",&stats);
  1623.             if(stats<1||stats>Lines)
  1624.                 {
  1625.                     sm("",1);
  1626.                 sprintf(str,"Line %d does not exist.",stats);
  1627.                 sm(str,1);
  1628.                 }
  1629.             } while(stats<1||stats>Lines);
  1630.         if(stats<0) { break; }
  1631.         if(stats==0) { continue; }
  1632.         sm("",1);
  1633.           sprintf(str,"%2d> %s",stats,MsgBuf[stats-1]);
  1634.         sm(str,1);sm("",1);
  1635.         sm("Is this the correct line (Y/N)? ",0);
  1636.         cn=YesNo(0);
  1637.         if(cn<0) { break; }
  1638.         if(cn)
  1639.             {
  1640.             for(j=(stats-1); j<Lines; j++)
  1641.                 {
  1642.                 strcpy(MsgBuf[j],MsgBuf[j+1]);
  1643.                 }
  1644.                sm("",1);
  1645.             sprintf(str,"Deleted line %d.",stats);
  1646.             Lines-=1;
  1647.             sm(str,1);
  1648.             }
  1649.         continue;
  1650.         }
  1651.     if(str[0]=='C'||str[0]=='c')
  1652.         {
  1653.         sm("",1);
  1654.         Lines-=1;
  1655.         if(Lines<0)
  1656.             {
  1657.             Lines=0;
  1658.             }
  1659.         strcpy(SPACE,MsgBuf[Lines]);
  1660.         BKFlag=0;
  1661.         x=strlen(SPACE);
  1662.         goto BEG_IN;
  1663.         }
  1664.     if(str[0]=='E'||str[0]=='e')
  1665.         {
  1666.         if(Lines<1)
  1667.             {
  1668.                sm("",1);
  1669.             sm("No Lines to edit!",1);
  1670.             continue;
  1671.             }
  1672.         LoopHere:
  1673.           sm("",1);
  1674.         sprintf(str,"Line number to edit [1..%d]? ",Lines);
  1675.         sm(str,0);
  1676.         pm("",str,5); stats=atoi(str);
  1677.         if(stats<0)
  1678.             {
  1679.             return(1);
  1680.             }
  1681.         if(str[0]=='\0')
  1682.             {
  1683.             continue;
  1684.             }
  1685.         sscanf(str,"%d",&x);
  1686.         if(x<1||x>Lines)
  1687.             {
  1688.                sm("",1);
  1689.             sprintf(str,"Line %d does not exist.",x);
  1690.             sm(str,1);
  1691.             goto LoopHere;
  1692.             }
  1693.           sm("",1);
  1694.         sprintf(SPACE,"%2d> %s",x,MsgBuf[x-1]);
  1695.         sm(SPACE,1);
  1696.           sm("",1);
  1697.         sm("    Old string;New string",0);sm("",1);
  1698.         sm("   (------------------------------------------------------------)",0);
  1699.         sm("",1); sm("   :",0);
  1700.         pm("",str,60); 
  1701.         if(str[0]=='\0')
  1702.             {
  1703.             continue;
  1704.             }
  1705.         stats=ProcessLine(str,MsgBuf[x-1],temp);
  1706.         if(stats==0)
  1707.             {
  1708.                sm("",1);
  1709.             sm("String not found!",1);
  1710.             continue;
  1711.             }
  1712.         else
  1713.             {
  1714.                sm("",1);
  1715.             sm("    NewLine:",1);sm("    --------",1);sm("   >",0);
  1716.             sm(temp,0);
  1717.             sm("",1);sm("",1);sm("Correct ",0);
  1718.             stats=YesNo(1);
  1719.             if(stats<0) { return(stats); }
  1720.             if(!stats)
  1721.                 {
  1722.                 continue;
  1723.                 }
  1724.             strcpy(MsgBuf[x-1],temp);
  1725.             }
  1726.         continue;
  1727.         }
  1728.     if(str[0]=='L'||str[0]=='l')
  1729.         {
  1730.         sm("",1);
  1731.         for(j=0; j<Lines; j++)
  1732.             {
  1733.             sprintf(SPACE,"%2d> %s",j+1,MsgBuf[j]);
  1734.             sm(SPACE,1);
  1735.             }
  1736.         continue;
  1737.         }
  1738. /*
  1739.     if(str[0]=='F'||str[0]=='f')
  1740.         {
  1741.         if(User.Sec_Status>250)
  1742.             {
  1743.             for(;;)
  1744.                 {
  1745.                 AEPutStr("\r\nEnter path/filename to attach ('5 <DIR>'=DIR): ");
  1746.                 stats=LineInput("",AttachedFile,250,KEYBOARD_TIMEOUT);
  1747.                 if(stats<0)
  1748.                     {
  1749.                     return(stats);
  1750.                     }
  1751.                 if(AttachedFile[0]=='5'&&AttachedFile[1]==' ')
  1752.                     {
  1753.                     strcpy(MAINMENU_Li,AttachedFile);
  1754.                     AttachedFile[0]='\0';
  1755.                     MyDirAnyWhere();
  1756.                     continue;
  1757.                     }
  1758.                 if(AttachedFile[0]!='\0')
  1759.                     {
  1760.                     BPTR fh;
  1761.  
  1762.                     strlwr(AttachedFile);
  1763.  
  1764.                     if(fh=Open(AttachedFile,MODE_OLDFILE))
  1765.                         {
  1766.                         Close(fh);
  1767.                         AEPutStr("Delete file when message is deleted ");
  1768.                         stats=YesNo(2);
  1769.                         if(stats<0)
  1770.                             {
  1771.                             return(stats);
  1772.                             }
  1773.                         if(stats)
  1774.                             {
  1775.                             AttachedFile[0]=toupper(AttachedFile[0]);
  1776.                             }
  1777.                         }
  1778.                     else
  1779.                         {
  1780.                         sprintf(GSTR3,"%s not found, try another.\r\n",AttachedFile);
  1781.                         AEPutStr(GSTR3);
  1782.                         AttachedFile[0]='\0';
  1783.                         continue;
  1784.                         }
  1785.                     }
  1786.                 break;
  1787.                 }
  1788.             }
  1789.         else
  1790.             {
  1791.             AEPutStr("\r\nCommand requires higher access.\r\n");
  1792.             }
  1793.         }
  1794. */
  1795.     if(str[0]=='S'||str[0]=='s')
  1796.         {
  1797.         //User.Messages_Posted++;
  1798.         return(0);
  1799.         }
  1800.  
  1801.     if(str[0]=='A'||str[0]=='a')
  1802.         {
  1803.         sm("",1);sm("Abort message entry (y/n)? ",0);
  1804.         stats=YesNo(0);
  1805.         if(stats<0)
  1806.             {
  1807.             break;
  1808.             }
  1809.         if(stats)
  1810.             {
  1811.             return(-1);
  1812.             }
  1813.         }
  1814.     } while(stats>=0);
  1815. return(stats);
  1816. }
  1817.  
  1818.  
  1819. int ProcessLine(char *pat, char *vorig, char *dest)
  1820. {
  1821. int i,i2,nff;
  1822. char rep[80],orig[100];
  1823.  
  1824. strcpy(orig,vorig);
  1825. for(i=0; i<=strlen(pat); i++)
  1826.     {
  1827.     if(pat[i]==';')
  1828.         {
  1829.         break;
  1830.         }
  1831.     }
  1832. if(i>=strlen(pat))
  1833.     {
  1834.     return(0);
  1835.     }
  1836. pat[i]='\0';
  1837. strcpy(rep,(char *)&pat[i+1]);
  1838.  
  1839. dest[0]='\0';
  1840.  
  1841. for(i=0; i<=(strlen(orig)-strlen(pat)); i++)
  1842.     {
  1843.     nff=1;
  1844.     if(pat[0]==orig[i])
  1845.         {
  1846.         nff=0;
  1847.         for(i2=i+1; (i2-i)<strlen(pat); i2++)
  1848.             {
  1849.             if(pat[i2-i]!=orig[i2])
  1850.                 {
  1851.                 nff=1;
  1852.                 break;
  1853.                 }
  1854.             }
  1855.         }
  1856.     if(nff!=1)
  1857.         {
  1858.         orig[i]='\0';
  1859.         strcpy(dest,orig);
  1860.         strcat(dest,rep);
  1861.         if(i2<strlen(vorig))
  1862.             {
  1863.             strcat(dest,(char *)&orig[i2]);
  1864.             }
  1865.         dest[75]='\0';
  1866.         return(1);
  1867.         }
  1868.     }
  1869. return(0);
  1870. }
  1871.  
  1872. int YesNo(UWORD flag)
  1873. {
  1874. int ch;
  1875. char temp[10];
  1876. if(flag)
  1877.     {
  1878.     ch=flag-1;
  1879.     sm((ch?"(y/N)? ":"(Y/n)? "),0);
  1880.     }
  1881.  
  1882. for(;;)
  1883.     {
  1884.      hotkey("",temp);ch=temp[0];
  1885.     if(ch<0) return(ch);
  1886.     if(ch=='\r'||ch=='\n')
  1887.         {
  1888.         if(flag==1)
  1889.             {
  1890.             ch='y';
  1891.             }
  1892.         if(flag==2)
  1893.             {
  1894.             ch='n';
  1895.             }
  1896.         }
  1897.     if(ch=='y'||ch=='Y')
  1898.         {
  1899.         sm("Yes",1);
  1900.         return(1);
  1901.         }
  1902.     if(ch=='n'||ch=='N')
  1903.         {
  1904.         sm("No",1);
  1905.         return(0);
  1906.         }
  1907.     }
  1908. }
  1909. void sr(char *str)
  1910. {
  1911.   register int i;
  1912.   i=strlen(str)-1;
  1913.   while(i>-1)
  1914.   {
  1915.     if(*(str+i)<=32) *(str+i)='\0'; else break;
  1916.     i--; 
  1917.   }
  1918. }
  1919.  
  1920. void strlim(char *str1,char *str2,int limit)
  1921. {
  1922.   register int i=0;
  1923.   if(strlen(str2)>limit)
  1924.   {
  1925.     printf("Error in line %d , setting is limited to %d characters\n",ALine,limit);
  1926.     printf(">%s\n\n",str2);
  1927.     ACPError=TRUE;
  1928.   }
  1929.   while(i<limit)
  1930.   {
  1931.     if(*(str2)=='\0') break;
  1932.     *(str1+i)=*(str2+i);
  1933.     i++;
  1934.   }
  1935. }
  1936. void CreateFile(char *str)
  1937. {
  1938.   FILE *fi;
  1939.   fi=fopen(str,"wb");
  1940.   fclose(fi);
  1941. }
  1942. int strnicmp(char *str1,char *str2,int len)
  1943. {
  1944.   register int i;
  1945.   strupr(str1);
  1946.   strupr(str2);
  1947.   i=0;
  1948.   while(i<len)
  1949.   {
  1950.     if(*(str1+i)!=*(str2+i)) return(1);
  1951.     i++;
  1952.   }
  1953.   return(0);
  1954. }
  1955. void Pause()
  1956. {
  1957.   char t[10];
  1958. sm("(Pause)...Space to Resume:",0);
  1959.         do
  1960.         {
  1961.           hk("",t);
  1962.         }
  1963.         while(t[0]!=32 && t[0]!=13 && t[0]!=12);
  1964.    sm("",1);
  1965. }
  1966. void Terminate(void)
  1967. {
  1968.   pu(OldConfName,BB_CONFNAME);
  1969.   pu(OldConfLoc,BB_CONFLOCAL);
  1970.   ShutDown();
  1971. }
  1972. void LastCommand(void)
  1973. {
  1974.   sm("",1);sm("",1);
  1975.   pu(OldConfName,BB_CONFNAME);
  1976.   pu(OldConfLoc,BB_CONFLOCAL);
  1977.  
  1978. }
  1979.  
  1980. int Allowed(void)
  1981. {
  1982.   FILE *fi;
  1983.   char image[200];
  1984.   char FileName[200];
  1985.   gu(image,DT_NAME);
  1986.   sprintf(FileName,"%sUsersAllowed",ConfLoc);
  1987.   fi=fopen(FileName,"r");
  1988.   if(fi==NULL) return(0);
  1989.   strupr(image); sr(image);
  1990.   while(fgets(FileName,80,fi)!=NULL)
  1991.   {
  1992.      sr(FileName);
  1993.      strupr(FileName);
  1994.      if(!strcmp(image,FileName))
  1995.      {
  1996.        fclose(fi); return(1);
  1997.      }
  1998.   }
  1999.   fclose(fi);
  2000.   return(0);
  2001. }